#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <errno.h>
#include <string.h>
///// 第一次演示 wait , 验证wait 可以解决僵尸问题 
//int main()
//{
//	printf("我是父进程 , 我的 pid  : %d , ppid : %d\n",getpid(),getppid());
//
//	//创建子进程
//	pid_t id = fork();	
//	if(id == 0)
//	{	
//		// 子进程走 5 s
//		int cns = 5;
//		while(cns)
//		{
//			printf("我是子进程 , 我的 pid  : %d , ppid : %d\n",getpid(),getppid());
//			sleep(1);
//			cns--;
//		}
//		// 子进程正常退出
//		exit(0);
//	}		
//	
//	// 父进程不退出 , 也不回收资源 
////	while(1)
////	{
////		//father
////		printf("我是父进程 , 我的 pid  : %d\n",getpid());
////		sleep(1);
////	}
//
//	sleep(10);
//	// 父进程不退出 , 回收资源
//	pid_t rid = wait(NULL); // NULL 意思是不获取退出信息
//	if(rid > 0)
//	{
//		printf("success !\n");
//	}
//
//	sleep(30);	
//
//	return 0;
//}




////////// waitpid 的使用

// errno 存的是错误码 ,  strerrno 打印错误码信息 !


int main()
{
	
	printf("我是父进程 , 我的 pid  : %d , ppid : %d\n",getpid(),getppid());

	//创建子进程
	pid_t id = fork();	
	if(id == 0)
	{	
		// 子进程走 5 s
		int cns = 5;
		while(cns)
		{
			printf("我是子进程 , 我的 pid  : %d , ppid : %d\n",getpid(),getppid());
			sleep(1);
			cns--;
		}
		// 子进程退出
		exit(1);
	}
	
	sleep(5);
			
	int wstatus = 0;
	//父进程等待 
	pid_t rid = waitpid(id , &wstatus , 0);

	if(rid > 0)
	{
		printf("Wait Success ! , exit code : %d , rid : %d\n", wstatus ,rid);
	}

	else
	{	
		printf("Wait Failed ! , err coed : %d -> %s , rid : %d\n",errno,strerror(errno),rid);
	}

	sleep(10);	

	return 0;
}

